package com.zyg.cart.service.impl;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.zyg.cart.client.ManagerClient;
import com.zyg.cart.entity.ItemEntity;
import com.zyg.cart.entity.TbOrder;
import com.zyg.cart.entity.TbOrderItem;
import com.zyg.cart.entity.group.Cart;
import com.zyg.cart.service.CartService;
import com.zyg.common.utils.IdWorker;
import com.zyg.common.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * ------------------------------
 * 功能：
 * 作者：WF
 * 微信：hbxfwf13590332912
 * 创建时间：2021/11/15-16:07
 * ------------------------------
 */
@Service
public class CartServiceImpl implements CartService {
    @Autowired
    private ManagerClient managerClient;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private IdWorker idWorker;
    //1. 添加到购物车
    @Override
    public void addCart(String name, Long itemId, int num) {
        //1.1 根据商品id得到商品对象
        ItemEntity itemEntity =  managerClient.findById(itemId);
        //1.2 得到商家id
        String sellerId = itemEntity.getSellerId();
        //1.3 根据商家id查询购物车
        //1.3.1 得到购物车列表
        String carts = redisTemplate.opsForValue().get(name);
        //1.3.2 如果为null，就初始化为[],
        List<Cart> cartList = null;
        if(StrUtil.isBlank(carts)){
            cartList = new ArrayList<>();
        }else{
            //1.3.3 转换为List<Cart>对象
            cartList = JSON.parseArray(carts, Cart.class);
        }

        //1.4 如果为null,就将当前商品放到购物车列表中
        //1.4.1 查询出购物车
        Cart cart = findByCart(cartList,sellerId);
        //1.4.2 判断是否购物车存在，如果不存在就创建，并放入到购物车列表中
        if(cart == null){
            //① 没有购物车就创建它
            cart = createCart(itemEntity,num);
            //② 创建完成后就添加到购物车列表中
            cartList.add(cart);
        }else{      //如果存在此购物车就修改其购物数量及小计金额
            List<TbOrderItem> orderItemList = cart.getOrderItemList();
            //① 判断当前商品是否在此订单项列表中
            TbOrderItem orderItem = findOrderItem(orderItemList,itemEntity);
            System.out.println("orderItem = " + orderItem);
            //② 如果不存在此订单项就添加到上面的订单项列表中
            if(orderItem == null){
                //1. 创建购物项
                orderItem = createOrderItem(itemEntity, num);
                //2. 将新的购物项放到订单列表中
                cart.getOrderItemList().add(orderItem);
            }else{      //如果存在此商品，就修改其数量及小计
                orderItem.setNum(orderItem.getNum() + num);     //修改数量
                //修改小计
                orderItem.setTotalFee(new BigDecimal(orderItem.getNum() * orderItem.getPrice().doubleValue()));
            }
            //极端情况：
            //1. 如果在购物车中的某件商品数量为0，就从购物车的商品列表中移除此商品
            if(orderItem.getNum() == 0){
                cart.getOrderItemList().remove(orderItem);
            }
            //2. 如果购物车列表中所有的商品列表数量为0，从购物车列表中移除此购物车
            if(cart.getOrderItemList().size() == 0){
                cartList.remove(cart);
            }
        }
        //最后，放到redis中保存
        redisTemplate.opsForValue().set(name,JSON.toJSONString(cartList),10, TimeUnit.DAYS);
    }



    //2. 根据商家id查询是否在购物车列表中有此购物车
    private Cart findByCart(List<Cart> cartList, String sellerId) {
        if(cartList != null)
        for (Cart cart : cartList) {
            if(cart.getSellerId() != null)
            if(sellerId.equals(cart.getSellerId())){
                return cart;
            }
        }
        return null;
    }
    //3. 将商品添加到购物车中，并返回新购物车
    private Cart createCart(ItemEntity itemEntity, int num) {
        //3.1 定义购物车对象
        Cart cart = new Cart();
        //3.2 设置关联的商家id及商家名称
        cart.setSellerId(itemEntity.getSellerId());
        cart.setSellerName(itemEntity.getSeller());
        //3.3 创建此购物车列表
        TbOrderItem item = createOrderItem(itemEntity,num);
        //3.4 将订单项列表设置给当前的购物车
        List<TbOrderItem> itemList = new ArrayList<>();
        itemList.add(item);
        cart.setOrderItemList(itemList);
        //3.5 返回
        return cart;
    }

    //4. 根据sku商品及购物数量，创建购物车列表
    private TbOrderItem createOrderItem(ItemEntity itemEntity, int num) {

        //4.1 定义一个订单id
        TbOrderItem orderItem = new TbOrderItem();
        orderItem.setGoodsId(itemEntity.getGoodsId());
        //4.2 生成一个随机id值
        long id = idWorker.nextId();
        //4.3 为订单项设置各个属性的值
        orderItem.setId(id);
        orderItem.setItemId(itemEntity.getId());
        orderItem.setNum(num);
        orderItem.setPrice(itemEntity.getPrice());
        orderItem.setTitle(itemEntity.getTitle());
        orderItem.setTotalFee(new BigDecimal(num * itemEntity.getPrice().doubleValue()));

        return orderItem;
    }

    //5. 查询是否存在某的购物项
    private TbOrderItem findOrderItem(List<TbOrderItem> orderItemList, ItemEntity itemEntity) {
        for (TbOrderItem orderItem : orderItemList) {
            if(orderItem.getItemId().longValue() == itemEntity.getId().longValue()){
                return orderItem;
            }
        }
        return null;
    }

    //6. 列表购物车
    @Override
    public List<Cart> showCartList(String name) {
        //6.1 得到购物车列表字符串
        String s = redisTemplate.opsForValue().get(name);
        //6.2 判断是否有内容
        if(StrUtil.isNotBlank(s)){
            return JSON.parseArray(s,Cart.class);
        }
        return new ArrayList<>();
    }
}
